<?php
/**
* @package Joostina
* @subpackage Security
* @copyright Авторские права (C) adw0rd (http://pyha.ru/forum/topic/2990.0). Все права защищены.
* @license Лицензия http://www.gnu.org/licenses/gpl-2.0.htm GNU/GPL, или help/license.php
* Joostina! - свободное программное обеспечение распространяемое по условиям лицензии GNU/GPL
* Для получения информации о используемых расширениях и замечаний об авторском праве, смотрите файл help/copyright.php.
*/

class iframeScanner
{
    /**
     * Необходимо передать путь до директории с которой надо начинать лечить
     * @param $directory
     */
    public function __construct($directory)
    {
        $this->directory = $directory;
    }
    
    /**
     * Сканирование.
     * Просто собирается со всех страниц информация о содержащихся в них iframe
     * @return array список файлов с iframe и сам iframe 
     */
    public function scan ()
    {
        
        $this->directoryLength = strlen($this->directory);
        
        $fileSPLObjects = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($this->directory),
            RecursiveIteratorIterator::CHILD_FIRST
        );
        
        foreach($fileSPLObjects as $fullFileName => $fileSPLObject) {
            
            if(preg_match('~\.'.$this->ignoreExts.'~', $fullFileName) or $fileSPLObject->isDir()) {
                continue;
            } 
 
            $this->fullFilesCount++;
            
            $this->fileContent = file_get_contents($fullFileName);
            $position = strpos($this->fileContent, '<iframe');
            
            if($position !== false) {
                
                $pf = preg_match_all('~<iframe src=\"(.*?)\".*?</iframe>~s', $this->fileContent, $matches);
                
                if(!$pf) {
                    continue;
                }
                
                $shortFileName = substr($fullFileName, $this->directoryLength);
                $this->infectionFilesCount++;
                
                $this->resultList[] = array(
                    'full_path' => $fullFileName,
                    'short_path' => $shortFileName,
                    'iframe' => $matches[0],  
                    'src' => $matches[1]
                );
                
            }
            
        }
        
        return $this->resultList;
    }
    
    /**
     * Лечилка.
     * Те iframe которые были найдены с помощью scan() будут удалены
     * @return int выводит кол-во удаленных iframe
     */
    public function cure () {
        
        $count = 0;
        
        foreach($this->resultList as $file) {
            
            $fileContent = file_get_contents($file['full_path']);
            $fileContent = str_replace($file['iframe'], '', $fileContent);
            file_put_contents($file['full_path'], $fileContent);
            $count++;
        }
        
        return $count;
    }
    
    public
        $directory = '',
        $directoryLength = 0,
        $ignoreExts = '(svn|gif|jpg|htaccess|png|ico|swf|mp3|flv|avi)',
        $fullFilesCount = 0,
        $infectionFilesCount = 0,
        $fileContent = '',
        $resultList = array();
}
?>